/**
 * 一个数组，如下操作：
 * 每次删除数组尾部t个元素，再将v接在尾部
 * 每次操作完，求后缀和的和
 * 
 * 令后缀和是 SIGMA{Si}
 * 加入v以后的后缀和是 SIGMA{Si} + nv
 * 其中n是加入v以后的当前数组长度
 * 因此维护数组D，Di为当前数组第i个位置的后缀和的和
 * 首先删除数组D的t个元素，然后将 D.back() + nv 加入尾部即可
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

llt const MOD = 1000000007LL;

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
    for(auto & i : v) is >> i;
    return is;
}

template<typename T>
void input(vector<T> & v, int n){
    v.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> v[i];
    return;
}

int Q;
vll D;

void work(){
    cin >> Q;
    D.reserve(Q + 1);
    D.emplace_back(0);

    for(int t,v,i=0;i<Q;++i){
        cin >> t >> v;
        if(t){
            D.erase(D.end() - t, D.end());
        }
        
        D.emplace_back((D.back() + v * (D.size() + 0LL) % MOD) % MOD);
        cout << D.back() << "\n";
    }
    
    return; 
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}